<?php 
  const tem = "dddddd";
  define("name", "value");
  //const define并不会自动添加到GLOBALS中
  // var_dump($GLOBALS["tem"]);
  // var_dump($GLOBALS["name"]);
  var_dump(name);
   $param = 40;
  //闭包如果要引入外部变量，必须要用use关键字导入
  // PHP 7.1 起，不能传入此类变量： superglobals、 $this 或者和参数重名
  //要想在闭包中改变外部变量，需要引用时取&，，，这和c一样，取地址,和oc的闭包一样理解
  $closure = function (string $name) use (&$param) : string {
   
   echo $param;
   $param = 30;
   echo "<br>",$param,"<br>";
   echo "闭包里的全局变量:",name,"<br>";
   
   return "我是闭包反回结果$name<br>";
  };
  $param = 10;
  echo  $closure(name);
  echo "改变后",$param,"<br>";
  interface AppInterface{

  function logUrl ();
   
  }

  /**
  * 
  */
  class App
  {
  	var $name="luojie";
  	//在类中定义属性初始值时，只能是设置一个常量，，，闭包这不是一个确定的直，不能设初始值
    // var $clo = function () {
    //  echo "我是类中的闭包属性";
   
    // };
    var $clo;
    //传入一个遵循AppInterface接口的实例
     function setLogUrl (AppInterface $inter) {
   
       $inter -> logUrl();

     }
  }


  $app = new App();

  // $app->clo = function () {
    
  //    echo "我是类中的闭包属性";
   
  // };
  //给类赋值一个闭包属性，但不能调用？？？？？
  // $app->clo();
  // var_dump($app->clo);
  // var_dump($app);

  $temClo = function () {
    echo $this->name;
  };
//bindTo给一个闭包绑定一个对象
  //因为在php中，闭包实际是系统Closure类的实例，所以在闭包中$this指向的是闭包自己，，，但是可以通过bingTo将闭包绑定到一个实例上，这个闭包的$this将指向这个实例，则在闭包中可以用$this访问这个实例的方法和属性
  //在闭包内可以访问这个实例，，，但这个实例却不能访问这个闭包
  $newClo = $temClo -> bindTo($app,"App");//返回的是一个新闭包,这是php7以前的写法
   var_dump($newClo);
   $newClo();
  var_dump($app);
  
   
   $temClo -> call($app);//php7的写法，，，绑定后直接调用

  // var_dump($new7Clo);
 
    //new class创建一个匿名类，这个类遵循AppInterface接口
    $app->setLogUrl(new class implements AppInterface {
     //实现接口方法
      function logUrl () {
      	echo "<br>www://baidu.com";
      } 

    });


 ?>